#ifndef TABLEWIDGETSHELL_H
#define TABLEWIDGETSHELL_H

#include <QObject>
#include "../../XXqtDefine.h"
#include <QVariant>
#include <QTableWidget>
#include "../Cell/CellBase.h"
#include "../Cell/TableRowCellGroup.h"

class TableWidgetShell : public QObject
{
    Q_OBJECT
public:
    TableWidgetShell(QObject *parent = nullptr);
    virtual ~TableWidgetShell() {}

    void shell(QTableWidget *tableWidget);

    // [-] config
    /**
     * @brief configColumn 配置table的列元素，titles、keys、cls列表长度需要为一致。（废弃）
     * @param titles 列显示的名称。
     * @param keys 列标识。
     * @param cls 列中的cell类型，需要继承CellBase。
     */
    void configColumn(const QStringList titles, const QStringList &keys, const QList<QMetaObject> &cls);

    TableWidgetShell& appendColumn(QString title, QString name, QMetaObject cls);
    /**
     * @brief appendColumn 配置table的列元素，每次配置一列，完成所有列的配置需要使用endConfigColumn。
     * @param title 列显示的名称。
     * @param key 列标识。
     * @param block 列中的cell创建块，创建的类型需要继承CellBase。
     * @return
     */
    TableWidgetShell& appendColumn(QString title, QString name, std::function<CellBase*(void)> block);
    /**
     * @brief endConfigColumn 配合configColumn(block)使用。
     */
    void endConfigColumn();
    void configSelectable(bool selectable);
    // [!] config

    // action
    void appendData(const QVariantMap &data);
    void insertData(int row, const QVariantMap &data);
    void removeData(int row);
    QVariantList getData();
    QVariantMap getData(int row);
    QVariantMap takeData(int row);

    void setData(const QVariantList &datas);
    void setData(int row, const QVariantMap &data);
    void updateData(int row, const QVariantMap &data);
    void select(int row);
    int findRowEqualTo(const QVariantMap &data);

    // signal
signals:
    void sigEvent(int row, QString name, QVariant info);
    void sigDataChanged(int row);
    void sigSelectionChanged(int current, int previous);

private:
    void setCurrentAcitveGroup(TableRowCellGroup *group);
    void setCurrentSelectGroup(TableRowCellGroup *group);

    Q_SLOT void tableWidget_onCellClicked(int row, int column);
    Q_SLOT void tableWidget_onCellDoubleClicked(int row, int column);
    Q_SLOT void tableRowCellGroup_onEvent(QString name, QVariant info);
    Q_SLOT void tableRowCellGroup_onDataChanged();
    Q_SLOT void group_onDestroyed(QObject *object);

private:
    QTableWidget *_tableWidget;
    QList<ColumnInfo> _columnInfoList;
    //QList<QPair<QString,QMetaObject>> _keyToCellClass;
    //QList<QPair<QString,QString>> _keyToColumnTitle;
    //QList<QPair<QString,std::function<CellBase*(void)>>> _keyToCellBlock;
    QList<TableRowCellGroup*> _groups;
    TableRowCellGroup *_currentSelectGroup;
    TableRowCellGroup *_currentActiveGroup;
};

#endif
